package com.blog.web.article.controller;

import java.io.File;
import java.util.Date;

import javax.annotation.Resource;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpSession;

import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.util.StringUtils;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.ResponseBody;
import org.springframework.web.multipart.MultipartFile;

import com.alibaba.fastjson.JSON;
import com.blog.consts.AppConsts;
import com.blog.service.entity.Article;
import com.blog.service.inter.ArticleService;
import com.blog.util.FileUtil;
import com.blog.util.UidUtil;
import com.blog.web.article.model.ArticleModel;
import com.blog.web.article.model.ArticlePageModel;
import com.blog.web.page.Page;
import com.blog.web.rtmsg.RtMsg;

/**
 * 文件名： com.blog.web.article.controller.ArticleController.java
 * 作者： G20
 * 日期： 2017年4月12日
 * 功能说明： 日志控制层
 * =========================================================
 * 修改记录：
 * 修改作者 日期 修改内容
 * =========================================================
 * Copyright (c) 2010-2011 .All rights reserved.
 */
@Controller
@RequestMapping(value = "/article")
public class ArticleController {

	@Resource
	private ArticleService articleService;

	/**
	 * @Method: com.blog.web.article.controller.ArticleController.backLogin
	 * @Description: 前台文章页面
	 * @author: WenBin
	 * @date: 2017年4月21日
	 * @version: 1.0
	 * @param model
	 * @param session
	 * @param amodel
	 * @return
	 * 		String
	 * @update [日期YYYY-MM-DD] [更改人姓名][变更描述]
	 */
	@RequestMapping(value = "/out")
	public String backLogin(Model model, HttpSession session, ArticleModel amodel) {

		session.setAttribute(AppConsts.NAV_TYPE, AppConsts.NAV_ARTICLE);
		session.setAttribute("page_length", null);
		Page page = articleService.queryListByPage(amodel);
		model.addAttribute("page", page);
		return "article/article";
	}

	/**
	 * @Method: com.blog.web.article.controller.ArticleController.addArticle
	 * @Description: 添加日志 ，后台管理
	 * @author: WenBin
	 * @date: 2017年4月15日
	 * @version: 1.0
	 * @param amodel
	 * @return
	 * 		Object
	 * @update [日期YYYY-MM-DD] [更改人姓名][变更描述]
	 */
	@RequestMapping(value = "/addArticle", produces = {
			AppConsts.PRODUCES_APPLICATION_JSON }, method = RequestMethod.POST)
	public @ResponseBody Object addArticle(ArticleModel amodel) {

		//
		return null;
	}

	/**
	 * @Method: com.blog.web.article.controller.ArticleController.updateArticle
	 * @Description:更新日志，后台管理
	 * @author: WenBin
	 * @date: 2017年4月15日
	 * @version: 1.0
	 * @param amodel
	 * @return
	 * 		Object
	 * @update [日期YYYY-MM-DD] [更改人姓名][变更描述]
	 */
	@RequestMapping(value = "/updateArticle", produces = {
			AppConsts.PRODUCES_APPLICATION_JSON }, method = RequestMethod.POST)
	public @ResponseBody Object updateArticle(ArticleModel amodel) {

		//
		return null;
	}

	/**
	 * @Method: com.blog.web.article.controller.ArticleController.delArticle
	 * @Description: 删除日志，后台管理
	 * @author: WenBin
	 * @date: 2017年4月15日
	 * @version: 1.0
	 * @param amodel
	 * @return
	 * 		Object
	 * @update [日期YYYY-MM-DD] [更改人姓名][变更描述]
	 */
	@RequestMapping(value = "/delArticle", produces = {
			AppConsts.PRODUCES_APPLICATION_JSON }, method = RequestMethod.POST)
	public @ResponseBody Object delArticle(ArticleModel amodel) {

		//
		return null;
	}

	/**
	 * @Method: com.blog.web.article.controller.ArticleController.queryArticle
	 * @Description: 查询日志
	 * @author: WenBin
	 * @date: 2017年4月21日
	 * @version: 1.0
	 * @param amodel
	 * @return
	 * 		Object
	 * @update [日期YYYY-MM-DD] [更改人姓名][变更描述]
	 */
	@RequestMapping(value = "/out/queryArticle")
	public @ResponseBody Object queryArticle(Model model, HttpSession session, ArticleModel amodel) {

		Integer length = session.getAttribute("page_length") == null ? 0
				: (Integer) session.getAttribute("page_length");
		length += 10;
		session.setAttribute("page_length", length);
		amodel.setLimit(length);
		amodel.setOffset(10);
		Page page = articleService.queryListByPage(amodel);

		System.out.println(JSON.toJSONString(page));
		return page;
	}

	/**
	 * @Method: com.blog.web.article.controller.ArticleController.showArticle
	 * @Description: 打开单篇日志
	 * @author: WenBin
	 * @date: 2017年4月21日
	 * @version: 1.0
	 * @param article_id
	 * @param model
	 * @return
	 * 		String
	 * @update [日期YYYY-MM-DD] [更改人姓名][变更描述]
	 */
	@RequestMapping(value = "/out/showArticle", produces = { AppConsts.PRODUCES_APPLICATION_JSON })
	public String showArticle(String article_id, Model model) {

		Article art = articleService.findArticleById(article_id);
		String text = FileUtil.readTxtFile(art.getArticleText());
		art.setArticleText(text);
		model.addAttribute("article", art);
		return "article/showArticle";
	}

	/**
	 * @Method: com.blog.web.article.controller.ArticleController.articleList
	 * @Description: 后台文章管理页面
	 * @author: WenBin
	 * @date: 2017年4月21日
	 * @version: 1.0
	 * @return
	 * 		String 后台日志管理页面
	 * @update [日期YYYY-MM-DD] [更改人姓名][变更描述]
	 */
	@RequestMapping(value = "/backArticleList", produces = { AppConsts.PRODUCES_APPLICATION_JSON })
	public String articleList() {

		return "article/backArticleList";
	}

	/**
	 * @Method: com.blog.web.article.controller.ArticleController.queryList
	 * @Description: 后台 文章系统分页查询
	 * @author: WenBin
	 * @date: 2017年4月21日
	 * @version: 1.0
	 * @param model
	 * @return
	 * 		Object
	 * @throws Exception
	 * @update [日期YYYY-MM-DD] [更改人姓名][变更描述]
	 */
	@RequestMapping(value = "/queryList", produces = { AppConsts.PRODUCES_APPLICATION_JSON })
	public @ResponseBody Object queryList(@RequestBody ArticlePageModel model) throws Exception {

		model.castQueryObject(model);
		Page page = articleService.queryAllListByPage(model);
		return page;
	}

	/**
	 * @Method: com.blog.web.article.controller.ArticleController.publishArticle
	 * @Description: 通过主键 --发布文章 或者 撤销文章
	 * @author: G20
	 * @date: 2017年4月22日
	 * @version: 1.0
	 * @param article_id
	 *            主键
	 * @return
	 * 		Object
	 * @update [日期YYYY-MM-DD] [更改人姓名][变更描述]
	 */
	@RequestMapping(value = "/publishArticle", produces = { AppConsts.PRODUCES_APPLICATION_JSON })
	public @ResponseBody Object publishArticle(String article_id) {

		Article art = articleService.findArticleById(article_id);
		if (art == null) {
			return new RtMsg(AppConsts.RT_CODE_VALIDATOR);
		}
		if (art.getIsPublish().equals(AppConsts.PUBLISH_YES)) {
			art.setIsPublish(AppConsts.PUBLISH_NO);
		} else {
			art.setIsPublish(AppConsts.PUBLISH_YES);
		}
		art.setUpdatedAt(new Date());
		art.setUpdatedBy("admin");
		articleService.updateArticle(art);
		return new RtMsg();
	}

	/**
	 * @Method: com.blog.web.article.controller.ArticleController.addOrUpdateArticlePage
	 * @Description: 添加文章页面
	 * @author: WenBin
	 * @date: 2017年4月22日
	 * @version: 1.0
	 * @param article_id
	 * @param model
	 * @return
	 * 		String
	 * @update [日期YYYY-MM-DD] [更改人姓名][变更描述]
	 */
	@RequestMapping(value = "/addOrUpdateArticlePage")
	public String addOrUpdateArticlePage(String article_id, Model model) {

		Article art = articleService.findArticleById(article_id);
		model.addAttribute("article", art);
		return "article/addOrUpdateArticle";
	}

	/**
	 * @Method: com.blog.web.article.controller.ArticleController.deleteArticle
	 * @Description: 删除文章
	 * @author: G20
	 * @date: 2017年4月22日
	 * @version: 1.0
	 * @param article_id
	 *            主键
	 * @return
	 * 		Object
	 * @update [日期YYYY-MM-DD] [更改人姓名][变更描述]
	 */
	@RequestMapping(value = "/deleteArticle", produces = { AppConsts.PRODUCES_APPLICATION_JSON })
	public @ResponseBody Object deleteArticle(String article_id) {

		Article art = articleService.findArticleById(article_id);
		articleService.deleteArticle(art);
		return new RtMsg();
	}

	/**
	 * @Method: com.blog.web.article.controller.ArticleController.addOrUpdateArticle
	 * @Description: 添加日志 或者更新日志
	 * @author: G20
	 * @date: 2017年4月22日
	 * @version: 1.0
	 * @param article_id
	 *            修改的主键
	 * @param model
	 * @param file
	 *            上传的文件
	 * @param name
	 *            名称
	 * @param type
	 *            类型
	 * @param desc
	 *            描述
	 * @param img
	 *            图片
	 * @param request
	 * @return
	 * 		String
	 * @update [日期YYYY-MM-DD] [更改人姓名][变更描述]
	 */
	@RequestMapping(value = "/addOrUpdateArticle")
	public String addOrUpdateArticle(String article_id, Model model, @RequestParam("file") MultipartFile file,
			String name, String type,
			String desc, String img, HttpServletRequest request) {

		String filePath = "";
		if (file != null && !file.isEmpty()) {
			try {
				// 文件保存路径
				filePath = request.getSession().getServletContext().getRealPath("/") + "upload/"
						+ new Date().getTime() + file.getOriginalFilename();
				// 转存文件
				file.transferTo(new File(filePath));
			} catch (Exception e) {
				e.printStackTrace();
			}
		}
		Article art = articleService.findArticleById(article_id);
		if (StringUtils.isEmpty(name)) {
			name = file.getOriginalFilename();
		}
		if (StringUtils.isEmpty(desc)) {
			name = file.getOriginalFilename();
		}
		if (art == null) {
			art = new Article();
			art.setArticleId(UidUtil.uuid32());
			art.setArticleName(name);
			art.setArticleDesc(desc);
			art.setArticleType(type);
			art.setImgId(img);
			art.setArticleText(filePath);
			art.setCreatedAt(new Date());
			art.setCreatedBy("admin");
			art.setUpdatedAt(new Date());
			art.setUpdatedBy("admin");
			articleService.saveArticle(art);
		} else {
			art.setArticleName(name);
			art.setArticleDesc(desc);
			art.setArticleType(type);
			if (!StringUtils.isEmpty(filePath)) {
				art.setArticleText(filePath);
			}
			art.setImgId(img);
			art.setUpdatedAt(new Date());
			art.setUpdatedBy("admin");
			articleService.updateArticle(art);
		}
		return "login/backdoorMainPage";
	}
}
